package codewars.strings;

/**
 * Word a10n (abbreviation)
 * CodeWars: https://www.codewars.com/kata/5375f921003bf62192000746/train/java
 * Topics: fundamentals, strings
 *
 * 给了一句英文话，要求把这个英文话里的单词简化成数字的压缩格式
 * 【注意】：
 * 1）只对 length >= 4 的单词压缩
 * 2）注意单词的间隔符，并且要保留间隔符
 *
 * 举栗：
 * Input: elephant-rides are really fun!
 * OutPut: e6t-r3s are r4y fun!
 *
 *
 * 解题思路：
 * 记录单词出现的 startIdx 和 endIdx
 * 遇到当前char 不是字母的，就把前一个单词判断并压缩。
 *
 * PS：所以才会在末尾加一个非字母符号，用于处理末尾单词的情况。
 *
 *
 * Created by Antony on 2019-05-14 11:47
 */
public class WordAbbreviation {

    public static void main(String[] args) {
        String s = "elephant---rides are really funnnn!!!";
//        System.out.println(abbreviate_my(s));

        System.out.println(abbreviate_best_practice(s));
    }


    /**
     * 别人写的思路，用正则提取单词 和 单词之间的空隙。
     * 提取出来以后就简单了
     *
     * @param s
     * @return
     */
    public static String abbreviate_best_practice(String s){
        String[] words = s.split("[^a-zA-Z]+");         // 提取单词
        String[] separators = s.split("[a-zA-Z]+");     // 提取单词之间的空隙
        String result = "";

        int i = 1;
        for (String word : words) {
            result += processWord(word);
            if (i < separators.length) {
                result += separators[i++];
            }
        }
        return result;
    }

    private static String processWord(String word) {
        if (word.length() < 4) return word;
        int n = word.length() - 2;
        return "" + word.charAt(0) + n + word.charAt(word.length() - 1);
    }


    /**
     * 解题思路：
     * 记录单词出现的 startIdx 和 endIdx
     * 遇到当前char 不是字母的，就把前一个单词判断并压缩。
     *
     * PS：所以才会在末尾加一个非字母符号，用于处理末尾单词的情况。
     *
     * @param string
     * @return
     */
    public static String abbreviate_my(String string) {
        string = string + "-";      // 增加一个非字母末尾，用于处理结尾是字母的情况。
        char[] charArr = string.toCharArray();
        StringBuilder bu = new StringBuilder();

        int letterBeginIdx = 0;
        int letterEndIdx = 0;
        boolean preIsLetter = false;

        for(int i=0; i<charArr.length; i++){
            char c = charArr[i];
            boolean currIsLetter = isLetter(c);
            if(currIsLetter && !preIsLetter){
                letterBeginIdx = bu.length();
            }
            if(!currIsLetter && preIsLetter){
                letterEndIdx = bu.length()-1;
            }

            if(!currIsLetter && letterEndIdx - letterBeginIdx > 2){
                bu.replace(letterBeginIdx+1, letterEndIdx, String.valueOf(letterEndIdx - letterBeginIdx - 1));
                letterBeginIdx=0;
                letterEndIdx=0;
            }

            bu.append(c);
            preIsLetter = currIsLetter;
        }

        return bu.substring(0,bu.length()-1);
    }

    public static boolean isLetter(char c){
        return (c>='a' && c<='z') || (c>='A' && c<='Z');
    }
}
